package com.yangyang.utils;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * 
 * @author lxh
 *
 */
public class DateUtil {

	// 1-1 将Date类型转换为String(固定格式)
	public static String getStrFromDate(Date date) {
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}

	// 1-2 将Date类型转换为String(自定义格式)
	public static String getStrFromDate(Date date, String param) {
		return new SimpleDateFormat(param).format(date);
	}

	// 2-1 将string字符串转换为日期
	public static Date getDateFromStr(String param) throws Exception {
		return new SimpleDateFormat("yyyy-MM-dd").parse(param);
	}
	
	//指定格式的date类型的转换
	public static Date getDateFromStr(String param,String pattern) throws Exception {
		return new SimpleDateFormat(pattern).parse(param);
	}

	// 3 计算传入日期到现在共有多少月
	public static int getMonth(Date date) {

		// 日历类
		Calendar instance = Calendar.getInstance(); // 当前时间日历
		// 获取当前时间日期的年和月
		int nowYear = instance.get(Calendar.YEAR);
		int nowMonth = instance.get(Calendar.MONTH);
		// 重新设置日历类日期
		instance.setTime(date);
		// 获取传入日期的年和月
		int year = instance.get(Calendar.YEAR);
		int month = instance.get(Calendar.MONTH);
		return 12 * (nowYear - year) + (nowMonth - month);
	}

	// 4-1 获取年龄（根据出生日期计算年龄）
	public static int getAge(Date date) {

		// 日历类
		Calendar instance = Calendar.getInstance(); // 当前时间日历
		// 获取当前时间日期的年和月
		int nowYear = instance.get(Calendar.YEAR);
		int nowMonth = instance.get(Calendar.MONTH);
		int nowDay = instance.get(Calendar.DAY_OF_MONTH);

		// 重新设置日历类日期
		instance.setTime(date);
		// 获取传入日期的年和月
		int year = instance.get(Calendar.YEAR);
		int month = instance.get(Calendar.MONTH);
		int day = instance.get(Calendar.DAY_OF_MONTH);

		// 数据运算
		int age = nowYear - year;
		if (nowMonth < month) {
			age--;
		}
		if (nowMonth == month && nowDay < day) {
			age--;
		}
		return age;
	}

	// 4-2 LocalDateTime 处理时间问题(第二种根据生日计算年龄的方法)
	public static int getBirthAge(Date birthday) {
		// 1.获取系统的年月日
		LocalDateTime now = LocalDateTime.now();
		int year = now.getYear();
		Month month = now.getMonth();
		int dayOfMonth = now.getDayOfMonth();
		// 2、出生日期的年月日类型转换
		Instant instant = birthday.toInstant();
		ZoneId zoneId = ZoneId.systemDefault(); // 获取系统所在时区
		LocalDateTime of = instant.atZone(zoneId).toLocalDateTime(); // 将date类型转换成localdatetime类型
		int year1 = of.getYear();
		Month month1 = of.getMonth();
		int dayOfMonth1 = of.getDayOfMonth();
		int age = year - year1;// 年龄

		int compareTo = now.compareTo(of);
		// 还没有到生日月份
		if (month.compareTo(month1) < 0) {
			// 让年龄减小1
			return age--;
		}
		if (month.compareTo(month1) == 0 && dayOfMonth < dayOfMonth1) {
			// 让年龄减小1
			return age--;
		}
		return age;
	}

	// 5.获取传入时间的月初结束时间
	public static Date getFirstDayOfMonth(Date date) {

		// 获取日历类对象
		Calendar instance = Calendar.getInstance();
		// 重新赋值
		instance.setTime(date);
		// 天数改为当月第一天
		instance.set(instance.get(Calendar.YEAR), instance.get(Calendar.MONTH), 1, 0, 0, 0);
		return instance.getTime();
	}

	// 6.获取传入时间的月末结束时间（当月的最后一天凌晨）
	public static Date getLastDayOfMonth(Date date) {

		// 获取日历类对象
		Calendar instance = Calendar.getInstance();
		// 重新赋值
		instance.setTime(date);
		// 对数据进行操作in
		// 月份加一
		instance.add(Calendar.MONTH, 1);
		// 天数改为当月第一天
		instance.set(instance.get(Calendar.YEAR), instance.get(Calendar.MONTH), 1, 0, 0, 0);
		// 秒数减一
		instance.add(Calendar.SECOND, -1);

		return instance.getTime();
	}

	// 7.获取当前时间的指定天数的时间（正数：未来日期；负数：历史日期）
	public static Date offsetDate(int days) {

		Calendar instance = Calendar.getInstance();
		instance.add(Calendar.DAY_OF_MONTH, days);
		return instance.getTime();
	}

	// 8.获取当前季节
	public static String getCurrentSeason() {

		Calendar instance = Calendar.getInstance();
		int month = instance.get(Calendar.MONTH) + 1;
		System.out.println(month);

		// 春3-4-5；夏6-7-8；秋9-10-11；冬12-1-2
		if (month < 9 && month > 2) {
			if (month < 6) {
				return Season.SPRING.getName();
			}
			return Season.SUMMER.getName();
		} else {
			if (month >= 9 && month < 12) {
				return Season.AUTUMN.getName();
			}
			return Season.WINTER.getName();
		}

	}

	// 9.获取人性化时间：例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	public static String getDisplayTime(Date date) {
		// 获取传入日期的毫米值 ;从1970-1-1 到date 的毫米值
		long t1 = date.getTime();
		// 当前系统日期的毫米值;即 从1970-1-1 到现在的毫米值
		long t2 = new Date().getTime();
		// 获取两个时间的差值
		long t = t2 - t1; // 毫秒
		// 分钟
		long minute = t / 1000 / 60;
		if (t2 < t1)
			return "未来时间";
		if (minute / 60 / 24 / 30 / 12 >= 1)
			return minute / 60 / 24 / 30 / 12 + "年前";
		else if (minute / 60 / 24 / 30 >= 1)
			return minute / 60 / 24 / 30 + "月前";
		else if (minute / 60 / 24 >= 1)
			return minute / 60 / 24 + "天前";
		else if (minute / 60 >= 1)
			return minute / 60 + "小时前";
		else if (minute > 5)
			return minute + "分钟前";
		else
			return "刚刚";
	}

	// 计算出距离指定日期还有多少天 --如距离北京冬奥会还有多少天
	public static int getDays(Date date) {
		//当前系统时间的毫秒值
		long time1 = new Date().getTime();
		//传入时间的毫秒值
		long time2 = date.getTime();
		if(time2>time1){
			return (int)(time2-time1)/1000/60/60/24;
		}
		return 0;
	}

}
